package com.smart.jetpackcomposestate.examples.delegate

import kotlin.reflect.KProperty

/**
 * @author huangzehui
 * @date 7/8/2025 上午1:12 周四
 * @description 代理和委托的学习
 */

// 类委托
// 类的委托，即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。
interface Base {
    fun doSomething()
}

class BaseImpl(val x: Int) : Base {
    override fun doSomething() {
        println("doSomething: ${x}")
    }

}

// 在Derived声明中，by子句表示，将b保存在Derived的对象实例内部，
// 而且编译器将会生成继承自Base接口的所有方法，并将调用转发给b。
class Derived(b: Base) : Base by b

// 属性委托
//属性委托指的是一个类的某个属性值不是在类中直接进行定义，而是将其托付给一个委托类，从而实现对被委托类的属性统一管理
//by关键字之后的表达式就是委托，属性的get(）方法（以及set(）方法)将被委托给这个对象的getValue()和setValue()
class Example {
    var name: String by Delegate()
}

// 该类需要包含getValue(）方法和setValue(）方法，
//且参数thisRef为进行委托的类的对象，property为进行委托的属性的对象。

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, 这里委托${property.name}属性"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef 的 ${property.name}属性赋值为 $value")
    }
}

class DelegateStudy {

    fun test1() {
        val b = BaseImpl(10)
        Derived(b).doSomething()
    }

    fun test2() {
        val e = Example()
        println("e.name:${e.name}")

        e.name = "Ning"
        println("e.name:${e.name}")
    }
}